// 1. 所有函数都是通过***new 函数***创建的
// 所有的函数也是对象
//  函数也可以有属性
// 所有对象都是引用类型

// 原型 prototype 
// 所有函数都有一个属性, prototype, 函数原型
// 默认的情况下 是Object对象
// prototype={}
// 默认情况下, prototype中有一个属性, constructor,
// 它也是一个对象,它指向构造函数本身.

// 隐式原型 __proto__
// 所有的对象都有一个属性 __proto__ 称之为隐式原型
// 默认情况下, 隐式原型指向创建改对象的函数的原型

// 当访问一个对象的成员时:
// 1.看该对象自身是否拥有该成员,如果有直接使用
// 2.看该对象的隐式原型是否拥有该成员,如果有直接使用
// 猴子补丁, 给原型上增加方法.

// 原型链
// 1. Function的__proto__指向自身的原型
// 2. Object的prototype的__proto__指向null


// 获取Object的隐式原型
; (function () {
    return
    const obj = {}
    let a = Object.getPrototypeOf(obj) == obj.__proto__
    console.log(Object.getPrototypeOf(obj).constructor.name); // true
})();

// 判断当前的对象(this)是否在指定对象的原型链上
; (function () {
    return
    //   instanceof
    // 判断一个真数组

    // Array.prototype.isPrototypeOf(xxx)

    // prototypeObj是不是instanceObj的原型之一
    // prototypeObj.isPrototypeOf(instanceObj)
    // prototypeObj：需要判断是否为原型的对象。
    // instanceObj：需要检测其原型链中是否包含prototypeObj的对象

    class Obj {

    }
    let obj = new Obj()
    console.log(obj instanceof Obj); // true 
    console.log(Obj.prototype.isPrototypeOf(obj)) // true
})();


; (function () {
    return
    //   Object.create('某个对象为隐式原型')

    let obj = { x: 1 }
    let obj2 = Object.create(obj)
    console.log(obj2.x)
    console.log(obj2.constructor)


    //   Object.create(null) //隐式原型为null
})();

// 判断自身是否拥有对应属性
; (function () {
    return
    let obj = {
        x: 1,
        y: 2,
        z: 3
    }
    let b = Object.create(obj)
    for (const key in b) {
        console.log(key)// 得到了 x y z
    }
    let a = obj.hasOwnProperty('x')
    console.log(a);
})();


// 类数组转化为真数组
; (function () {
    //return
    //   Array.prototype.slice.call('类数组')  //剪贴数组后返回真数组
})();

// 继承
;(function(){
  //return
//   User继承自Object
//   Object是User的父类
//   User是Object的子类
// 默认情况下, 所有构造函数父类都是Object
 class User{
    constructor(firstName,lastName,age){
        this.firstName = firstName
        this.lastName = lastName
        this.fullName = this.firstName + ' '
        this.age = age
    }
    syHello(){
        console.log(`大家好,我叫${this.fullName},今年${this.age}岁了`)
    }
 }

 class VIPUser extends User{
    constructor(firstName,lastName,age,money){
        super(firstName,lastName,age)
        this.money = money
    }
    upgrade(){
        console.log(`使用了${this.money}元软妹币,升级了`)
    }
 }
 let vUser = new VIPUser('元','进',16,1100)
 vUser.upgrade()
})();